home *** CD-ROM | disk | FTP | other *** search
/ Technotools / Technotools (Chestnut CD-ROM)(1993).ISO / lang_c / life_src / life.c
Text File  |  1988-01-26  |  6KB  |  244 lines

  1. /*    LIFE.C        The much implemented game of Life invented by John Conway
  2.  
  3.                 This version was written to illustrate the use of the C88
  4.                 screen and keyboard interface.
  5.  
  6.                 To generate:
  7.                 A>C88 B:LIFE
  8.                 A>ASM88 B:PCIO
  9.                 A>BIND B:LIFE B:PCIO        */
  10.  
  11.  
  12. /*
  13.   global constant and data declarations
  14. */
  15.  
  16. #define    ROWS    24
  17. #define COLS    80
  18.  
  19. /* control key translations */
  20. #define up_char 30
  21. #define down_char    31
  22. #define left_char 29
  23. #define right_char 28
  24. #define bol_char 200
  25. #define eol_char 201
  26. #define pageup_char 202
  27. #define pagedown_char 203
  28. #define bof_char 204
  29. #define eof_char 205
  30. #define Ins_char 206
  31. #define Del_char 207
  32. #define NextWord_char 208
  33. #define PrevWord_char 209
  34.  
  35. /* function keys */
  36. #define M1 210
  37. #define M2 211
  38. #define M3 212
  39. #define M4 213
  40. #define M5 214
  41. #define M6 215
  42. #define M7 216
  43. #define M8 217
  44. #define M9 218
  45. #define M10 219
  46.  
  47.  
  48. char world[ROWS][COLS],create_mode=1,quit_flag;
  49. int  population,generation,crow,ccol;
  50.  
  51. main() {
  52.  
  53.     scr_clr();
  54.     instruct();
  55.     setup();
  56.  
  57.     do {
  58.         generation++;
  59.         cycle();
  60.         screen();
  61.         }
  62.     while (population && !quit_flag);
  63.     scr_rowcol(ROWS,10);
  64.     if (population == 0)
  65.         puts("Nobody left, sorry about that.                       ");
  66.     else puts("bye                                                 ");
  67.     scr_curson();
  68.     }
  69.  
  70. instruct() {        /*    print instructions    */
  71.  
  72. puts("                The game of Life by John Conroy\n\n");
  73. puts("      If started with a number, a random pattern starts the game.\n\n");
  74. puts("  Otherwise, move the cursor with the four arrow keys to create life.\n\n");
  75. puts("     DEL changes cursor movement to mean that cells are deleted\n\n");
  76. puts("                 INS flips back to create mode.\n\n");
  77. puts("          The '+' key will toggle the game on or off.\n\n");
  78. puts("                     Hit ESC to bail out.\n\n");
  79. puts("            Enter starting number of cells or hit CR   ");
  80.     }
  81.  
  82. setup() {
  83.     int rnumber;
  84.     int i,row,col,seed,rnum;
  85.     char ch;
  86.  
  87.     rnumber=0;
  88.     while (1) {
  89.         while ((ch=scr_csts()) == 0) seed++;
  90.         if (ch < '0' || ch > '9') break;
  91.         scr_co(ch);
  92.         rnumber*=10;
  93.         rnumber+=ch-'0';
  94.         }
  95.     scr_cursoff();
  96.     scr_clr();
  97.     scr_rowcol(ROWS,20);    /*    print population message    */
  98.     puts("Generation    0     Population    0");
  99.  
  100.     srand(seed);        /*    initilize random number generator    */
  101.  
  102.     for (i=0; i < rnumber; i++) {
  103.         rnum=rand();
  104.         row=rnum%ROWS;
  105.         col=(rnum/ROWS)%COLS;
  106.         world[row][col]='X'; /* put in a cell */
  107.         scr_rowcol(row,col);
  108.         scr_co(2);
  109.         }
  110.     if (rnumber == 0) create(1);
  111.     }
  112.  
  113.  
  114. screen() {    /* update the screen and set world back to x's    */
  115.     int  row,col;
  116.     char cell;
  117.  
  118.     population=0;
  119.     for (row=0; row < ROWS; row++) {
  120.         for (col=0; col < COLS; col++) {
  121.             cell=world[row][col];
  122.             /* stay alive if 3 neighbors, born if next to 2 or 3 */
  123.  
  124.             if (cell && (cell == 3 || cell == 'X'+2 || cell == 'X'+3)) {
  125.                 population++;
  126.                 if (cell < 'X') {
  127.                     scr_rowcol(row,col);
  128.                     scr_co(2);
  129.                     }
  130.                 cell='X';
  131.                 }
  132.             else {
  133.                 if (cell >= 'X') {
  134.                     scr_rowcol(row,col);
  135.                     scr_co(' ');
  136.                     }
  137.                 cell=0;
  138.                 }
  139.             world[row][col]=cell;
  140.             }
  141.         }
  142.     scr_rowcol(ROWS,31);
  143.     printf("%4d",generation);
  144.     scr_rowcol(ROWS,51);
  145.     printf("%4d",population);
  146.     }
  147.  
  148.  
  149. create(suspend)            /*    see if need to create or kill cells    */
  150.     char suspend; {
  151.     char ch,wait;
  152.  
  153.     while ((ch=scr_csts()) || suspend) {
  154.         switch (ch) {
  155.             case up_char:    crow=crow ? crow-1: ROWS-1;
  156.                             break;
  157.             case down_char:    crow=crow == ROWS-1 ? 0: crow+1;
  158.                             break;
  159.             case left_char:    ccol=ccol ? ccol-1: COLS-1;
  160.                             break;
  161.             case right_char:ccol=ccol == COLS-1 ? 0: ccol+1;
  162.                             break;
  163.             case bol_char:    ccol=0;
  164.                             break;
  165.             case eol_char:    ccol=COLS-1;
  166.                             break;
  167.             case '+':        suspend=!suspend;
  168.                             continue;
  169.             case Ins_char:    create_mode=1;
  170.                             continue;
  171.             case Del_char:    create_mode=0;
  172.                             continue;
  173.             case 0x1b:        quit_flag=1;    /* flag for stop */
  174.                             return;
  175.             default:        continue;
  176.             }
  177.         world[crow][ccol]= create_mode ? 'X': 0;
  178.         scr_rowcol(crow,ccol);
  179.         if (create_mode) {
  180.             scr_co(2);
  181.             population++;
  182.             }
  183.         else {
  184.             wait=30;
  185.             while (wait--) {
  186.                 scr_co(1);
  187.                 scr_rowcol(crow,ccol);
  188.                 }
  189.             scr_co(' ');
  190.             }
  191.         }
  192.     }
  193.  
  194. cycle() {                /* cycle to the next generation */
  195.     int  row,col;
  196.  
  197.     create(0);
  198.     /*    take care of left and right column first    */
  199.     for (row=0; row < ROWS; row++) {
  200.         if (world[row][0] >= 'X') add8(row,0);
  201.         if (world[row][COLS-1] >= 'X') add8(row,COLS-1);
  202.         }
  203.  
  204.     /*    take care of top and bottom line    */
  205.     for (col=1; col < COLS-1;col++) {
  206.         if (world[0][col] >= 'X') add8(0,col);
  207.         if (world[ROWS-1][col] >= 'X') add8(ROWS-1,col);
  208.         }
  209.  
  210.     /*    fill in the box, ignoring border conditions    */
  211.     for (row=1; row < ROWS-1; row++) {
  212.         for (col=1; col < COLS-1; col++) {
  213.             if (world[row][col] >= 'X' ) {
  214.                 world[row-1][col-1]++;
  215.                 world[row-1][col]++;
  216.                 world[row-1][col+1]++;
  217.                 world[row][col-1]++;
  218.                 world[row][col+1]++;
  219.                 world[row+1][col-1]++;
  220.                 world[row+1][col]++;
  221.                 world[row+1][col+1]++;
  222.                 }
  223.             }
  224.         }
  225.     }
  226.  
  227.  
  228. add8(row,col)
  229.     int  row,col; {
  230.     int  rrow,ccol,rr,cc;
  231.  
  232.     for (rr=row-1; rr <= row+1; rr++) {
  233.         for (cc=col-1; cc <= col+1; cc++) {
  234.             rrow=rr != -1 ? rr : ROWS-1;
  235.             ccol=cc != -1 ? cc : COLS-1;
  236.             if (rrow >= ROWS) rrow=0;
  237.             if (ccol >= COLS) ccol=0;
  238.             world[rrow][ccol]++;
  239.             }
  240.         }
  241.     world[row][col]--;
  242.     }
  243.     
  244.